Exercice réalisé ci-dessous :
Ce TP concerne le traitement et l’analyse d’images. Vous avez à disposition le fichier classImage.php. Cette classe a été réalisée spécialement pour vous permettre d’expérimenter des algorithmes simples sur des images.
Fabriquez une image de 100x100 entièrement orange (pas rouge, pas jaune, pas verte– orange).
<?php
include "classImage.php";
$monImage1 = new Image(100, 100);
$orange = imagecolorallocate($monImage1->getImage(), 255, 165, 0);
for ($i = 0; $i < 100; $i++) {
for ($j = 0; $j < 100; $j++) {
$monImage1->changeCouleurImageXY($i, $j, 255, 165, 0);
}
}
$monImage1->afficherImage();
imagedestroy($monImage1->getImage());
?>
Fabriquez une image de 200x200 qui contient des pixels de couleurs aléatoires (rand(0,255) retourne un nombre compris entre 0 et 255).
<?php
include "classImage.php";
$monImage = new Image(200, 200);
for ($i = 0; $i < 200; $i++) {
for ($j = 0; $j < 200; $j++) {
$r = rand(0, 255);
$g = rand(0, 255);
$b = rand(0, 255);
$monImage->changeCouleurImageXY($i, $j, $r, $g, $b);
}
}
$monImage->afficherImage();
imagedestroy($monImage->getImage());
?>
Fabriquez une image avec des bandes horizontales qui couvre toutes les couleurs saturées du spectre (rouge, jaune, vert, bleu, magenta).
<?php
include "classImage.php";
$largeur = 500;
$hauteur = 100;
$monImage = new Image($largeur, $hauteur);
$bandes_couleurs = array(
imagecolorallocate($monImage->getImage(), 255, 0, 0),
imagecolorallocate($monImage->getImage(), 255, 255, 0),
imagecolorallocate($monImage->getImage(), 0, 255, 0),
imagecolorallocate($monImage->getImage(), 0, 0, 255),
imagecolorallocate($monImage->getImage(), 255, 0, 255)
);
for ($i = 0; $i < $largeur; $i++) {
for ($j = 0; $j < $hauteur; $j++) {
$bande_index = intval($i / ($largeur / count($bandes_couleurs)));
imagesetpixel($monImage->getImage(), $i, $j, $bandes_couleurs[$bande_index]);
}
}
$monImage->afficherImage();
imagedestroy($monImage->getImage());
?gt;
Trouver une image de votre choix en négatif (vous trouverez votre bonheur sur google image). Coder un algorithme qui permet d’afficher cette image avec les bonnes couleurs.
<?php
include "classImage.php";
$monImage = new Image("negative.jpg");
for ($i = 0; $i < $monImage->getWidth(); $i++) {
for ($j = 0; $j < $monImage->getHeight(); $j++) {
$r = $monImage->getRougeImageXY($i, $j);
$g = $monImage->getVertImageXY($i, $j);
$b = $monImage->getBleuImageXY($i, $j);
$r_negatif = 255 - $r;
$g_negatif = 255 - $g;
$b_negatif = 255 - $b;
$monImage->changeCouleurImageXY($i, $j, $r_negatif, $g_negatif, $b_negatif);
}
}
$monImage->afficherImage();
imagedestroy($monImage->getImage());
?>
L’image "Vichy_Labo.jpg" est à l’envers. Coder un algorithme qui permet d’afficher cette image à l’endroit.
<?php
include "classImage.php";
$monImage = new Image("Vichy_Labo.jpg");
imageflip($monImage->getImage(), IMG_FLIP_HORIZONTAL);
$monImage->afficherImage();
imagedestroy($monImage->getImage());
?>
Vous disposez de 2 images : carte_droite et carte_gauche. Faites en sorte d’afficher les deux cartes sur la même image. (fait sans classImage)
<?php
$chemin_image1 = 'carte_gauche.jpg';
$chemin_image2 = 'carte_droite.jpg';
$image1 = imagecreatefromjpeg($chemin_image1);
$image2 = imagecreatefromjpeg($chemin_image2);
$largeur_image = imagesx($image1);
$hauteur_image = imagesy($image1);
$image_fusionnee = imagecreatetruecolor($largeur_image, $hauteur_image);
$seuil_blanc = 30;
function estBlanc($r, $v, $b, $seuil) {
return ($r > 255 - $seuil && $v > 255 - $seuil && $b > 255 - $seuil);
}
for ($x = 0; $x < $largeur_image; $x++) {
for ($y = 0; $y < $hauteur_image; $y++) {
$couleur_image1 = imagecolorat($image1, $x, $y);
$couleur_image2 = imagecolorat($image2, $x, $y);
if (!estBlanc(($couleur_image1 >> 16) & 0xFF, ($couleur_image1 >> 8) & 0xFF, $couleur_image1 & 0xFF, $seuil_blanc)) {
$couleur_fusionnee = $couleur_image1;
} elseif (!estBlanc(($couleur_image2 >> 16) & 0xFF, ($couleur_image2 >> 8) & 0xFF, $couleur_image2 & 0xFF, $seuil_blanc)) {
$couleur_fusionnee = $couleur_image2;
} else {
$couleur_fusionnee = imagecolorallocate($image_fusionnee, 255, 255, 255);
}
imagesetpixel($image_fusionnee, $x, $y, $couleur_fusionnee);
}
}
header('Content-Type: image/jpeg');
imagejpeg($image_fusionnee);
imagedestroy($image1);
imagedestroy($image2);
imagedestroy($image_fusionnee);
?>
Fabriquez un menu qui lit une image de votre choix en couleur (vous trouverez votre bonheur sur google image). Coder un algorithme qui permet d’afficher cette image en niveaux de gris. Colorisez cette image noir et blanc en rouge. En fait, on veut voir cette image comme à travers un filtre rouge.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Conversion d'image en niveaux de gris ou de rouge</title>
<link rel="stylesheet" href="menustyle.css">
<link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
</head>
<body>
<h1>Conversion d'image en niveaux de gris ou de rouge</h1>
<form action="" method="post" enctype="multipart/form-data">
<label for="image"><i class='bx bx-horizontal-right'></i> Sélectionnez une image <i class='bx bx-horizontal-left' ></i></label>
<input type="file" name="image" id="image" accept="image/*">
<button type="submit" name="submit_grayscale">Convertir en niveaux de gris</button>
<button type="submit" name="submit_red">Convertir en niveaux de rouge</button>
<button type="submit" name="submit_color">Afficher en couleur</button>
</form>
<?php
if (isset($_POST['submit_grayscale']) || isset($_POST['submit_red']) || isset($_POST['submit_color'])) {
if (!empty($_FILES['image']['name'])) {
$image_temp = $_FILES['image']['tmp_name'];
$image_info = getimagesize($image_temp);
if ($image_info !== false) {
$image_source = imagecreatefromstring(file_get_contents($image_temp));
if (isset($_POST['submit_grayscale'])) {
imagefilter($image_source, IMG_FILTER_GRAYSCALE);
$filter_name = 'grayscale';
} elseif (isset($_POST['submit_red'])) {
imagefilter($image_source, IMG_FILTER_COLORIZE, 255, 0, 0);
$filter_name = 'red';
} elseif (isset($_POST['submit_color'])) {
$filter_name = 'color';
}
$temp_file = tempnam(sys_get_temp_dir(), $filter_name . '_');
imagejpeg($image_source, $temp_file);
$web_accessible_path = '/grayscale_images/' . basename($temp_file);
$new_path = $_SERVER['DOCUMENT_ROOT'] . $web_accessible_path;
if (rename($temp_file, $new_path)) {
echo '<h2>Image en niveaux de ' . $filter_name . ' :</h2>';
echo '<img src="' . $web_accessible_path . '" alt="Image en niveaux de ' . $filter_name . '">';
} else {
echo '<p>Une erreur s\'est produite lors de la sauvegarde de l\'image en niveaux de ' . $filter_name . '.</p>';
}
imagedestroy($image_source);
if (file_exists($temp_file)) {
unlink($temp_file);
}
} else {
echo '<p>Le fichier sélectionné n\'est pas une image valide.</p>';
}
} else {
echo '<p>Veuillez sélectionner une image.</p>';
}
}
?>
</body>
</html>